import * as puppeteer from 'puppeteer-core';
// import * as fs from 'fs';

// const r = fs.readFileSync('', {encoding: 'utf-8'})

async function sleep(ms: number) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms);
  });
}

async function main() {
  // 启动浏览器
  const browser = await puppeteer.launch({
    // executablePath: 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
    executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
    headless: false, //使用无头模式（完全版本的浏览器）
    // 这里要置为 null 否则会出现很小的 viewport
    defaultViewport: null,
    // 启动后浏览器窗口最大化
    args: ['--start-maximized'],
  });
  // 查询当前所有标签页
  const pages = await browser.pages();

  // 如果已经有标签页 则使用第一个 否则新开标签页
  let page: puppeteer.Page;
  if (pages.length === 0) {
    page = await browser.newPage();
  } else {
    page = pages[0];
  }
  // 随便找了个网站，浏览器敲地址后回车
  // await page.goto("https://www.hao123.com/");
  await page.goto("https://www.bing.com/");
  // 这里最好使用 wait 等待某个 DOM 结构，我这里固定sleep
  await sleep(3 * 1000);
  // 留意这里 鼠标对象 每个页面都有独立的鼠标对象 不可混用
  const mouse = page.mouse;

  // 获取视口大小
  const r = await page.evaluate(() => {
    return { height: window.innerHeight, width: window.innerWidth };
  });
  if (!r) {
    console.warn('cannot get viewport size.');
    return;
  }

  // 找到搜索框元素 并输入文本
  await page.type('input[type="text"]', 'csdn');

  // 模拟按下回车键
  await page.keyboard.press('Enter');

  // 等待页面加载完毕
  await page.waitForNavigation();

  // 获取页面链接
  // const inputElement = await page.$('cite');
  // if (inputElement) {
  //   console.log(inputElement);
  //   await inputElement.click();
  //   console.log("点击")
  // }

  const a = await page.waitForXPath("");
  if(!a) {
    return;
  }
  const pos = await a.clickablePoint();
  page.mouse.move(pos.x, pos.y, {steps: 10});
  page.mouse.click(pos.x, pos.y);

  page.evaluate(() => {
    return document.querySelectorAll("a")
  })

  // 批量获取页面属性值
  const href = await page.$$eval('.tpcn > a', nodes => nodes.map(node => node.href));
  const hre = Object.values(href)
  // console.log(typeof(href))
  console.log(hre)
  // 遍历
  hre.forEach(el => {
    if (el.includes('https://www.csdn.net/')) {
      let index = Array.from(hre).indexOf(el);
      console.log('当前下标为' + Array.from(hre).indexOf(el))
      console.log(`============${hre[index]}`);
      page.click(hre[index]);
      return false
      console.log("href中的值" + el)
    }
    return false
  });


  // const name = await page.$eval('cite', el => el.innerText)
  // if(name == "https://www.csdn.net")
  // {

  //   console.log("点击"+name)
  // }

  // 将鼠标移动到视口中心位置
  await mouse.move(r.width / 2, r.height / 2);

  // 滚动鼠标滚轮 滚 5 次
  for (let i = 0; i !== 5; i++) {
    await mouse.wheel({ deltaY: 100 })
    await sleep(0.5 * 1000);
  }

  // 点击鼠标 最好不要直接对 DOM 节点使用click
  // 而要使用鼠标定位 甚至是移动，移动到指定节点座标上 使用鼠标对象点击
  // 部分站点会有虚假的 DOM 干扰

  console.log("加载完毕")

  // 关闭浏览器
  // await browser.close();
}

main();
